package com.xxxx.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxxx.crm.base.BaseService;
import com.xxxx.crm.dao.CustomerOrderMapper;
import com.xxxx.crm.dao.OrderDetailsMapper;
import com.xxxx.crm.query.OrderDetailsQuery;
import com.xxxx.crm.utils.AssertUtil;
import com.xxxx.crm.vo.CustomerOrder;
import com.xxxx.crm.vo.OrderDetails;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


@Service
public class OrderDetailsService extends BaseService<OrderDetails ,Integer> {

    @Resource
    private OrderDetailsMapper orderDetailsMapper;
    @Resource
    private CustomerOrderMapper customerOrderMapper;


    /***
     * 分页条件查询订单详情列表
     * @param orderDetailsQuery
     * @return java.util.Map<java.lang.String,java.lang.Object>
     */
    public Map<String, Object> queryOrderDetailsByParams(OrderDetailsQuery orderDetailsQuery) {
        Map<String, Object> map = new HashMap<>();

        // 开启分页
        PageHelper.startPage(orderDetailsQuery.getPage(), orderDetailsQuery.getLimit());
        // 得到对应分页对象
        PageInfo<OrderDetails> pageInfo = new PageInfo<>(orderDetailsMapper.selectByParams(orderDetailsQuery));

        // 设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        // 设置分页好的列表
        map.put("data",pageInfo.getList());
        return map;
    }

    /***
     * 添加订单明细数据
     *  1. 参数校验
     *      订单ID   非空，数据存在
     *      商品名称   非空
     *      单位      非空
     *      单价     非空
     *  2. 设置参数的默认值
     *      是否有效    默认有效
     *      创建时间    系统当前时间
     *      修改时间    系统当前时间
     *      商品价格总和  做计算
     *  3. 执行添加操作，判断受影响的行数
     * @param orderDetails
     * @return void
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addOrderDetails(OrderDetails orderDetails) {
        checkOrderDetails(orderDetails);

        orderDetails.setIsValid(1);
        orderDetails.setCreateDate(new Date());
        orderDetails.setUpdateDate(new Date());
        orderDetails.setSum(orderDetails.getPrice() * orderDetails.getGoodsNum());


        AssertUtil.isTrue(insertSelective(orderDetails) != 1, "订单明细添加失败！");
    }


    /**
     *  参数校验
     *      订单ID   非空，数据存在
     *      商品名称   非空
     *      单位      非空
     *      单价     非空
     *
     * @param orderDetails
     * @return void
     */
    private void checkOrderDetails(OrderDetails orderDetails) {
        Integer oId = orderDetails.getOrderId();
        AssertUtil.isTrue(null == oId || customerOrderMapper.selectByPrimaryKey(oId) == null,"请设置订单ID！");
        AssertUtil.isTrue(StringUtils.isBlank(orderDetails.getGoodsName()), "商品名称不能为空！");
        AssertUtil.isTrue(StringUtils.isBlank(orderDetails.getUnit()), "商品单位不能为空！");
        AssertUtil.isTrue(null==orderDetails.getPrice(), "单价不能为空！");
    }


    /**
     * 更新客户开发计划项数据
     *  1. 参数校验
     *      订单明细ID   非空，数据存在
     *      商品名称   非空
     *      单位      非空
     *      单价     非空
     *  2. 设置参数的默认值
     *      修改时间    系统当前时间
     *      商品价格总和  做计算，计算结果太大超过范围会报错，则调用BigInteger.valueOf("普通数值"),BigDecimal.valueOf("普通数值"),仍然无法解决。
     *      阉割更新订单明细功能
     *  3. 执行更新操作，判断受影响的行数

     * @param orderDetails
     * @return void
     */
//    @Transactional(propagation = Propagation.REQUIRED)
//    public void updateOrderDetails(OrderDetails orderDetails){
//
//        AssertUtil.isTrue(null == orderDetails.getId() || selectByPrimaryKey(orderDetails.getId()) == null, "待更新的记录不存在！");
//        checkOrderDetails(orderDetails);
//        orderDetails.setUpdateDate(new Date());
//        AssertUtil.isTrue(updateByPrimaryKeySelective(orderDetails) != 1, "订单明细更新失败！");
//
//    }

    /***
     * 删除计划项
     *  1. 判断ID是否为空，且数据存在
     *  2. 修改isValid属性
     *  3. 执行更新操作
     * @param id
     * @return void
     */
    public void deleteOrderDetails(Integer id) {
        // 1. 判断ID是否为空，且数据存在
        AssertUtil.isTrue(null == id, "待删除记录不存在！");
        // 通过ID查询计划项对象
        OrderDetails orderDetails = orderDetailsMapper.selectByPrimaryKey(id);
        // 设置记录无效（删除）
        orderDetails.setIsValid(0);
        orderDetails.setUpdateDate(new Date());
        // 执行更新操作
        AssertUtil.isTrue(orderDetailsMapper.updateByPrimaryKeySelective(orderDetails) != 1, "订单明细删除失败！");
    }
}
